#ifndef _H_LINKLIST_DYNAMIC_LYVM_H_
#define _H_LINKLIST_DYNAMIC_LYVM_H_

#include "Basic_Dynamic_lyvm.h"
#include "Animable.h"

using namespace std;

typedef std::map<int,std::vector<DIVA_VM*>> levelmap;
typedef std::map<DIVA_VM*,std::vector<pair<int,DIVA_VM*>>> linkmap;

class LinkList_Dynamic_Lyvm:public Basic_Dynamic_lyvm,Animable{
private:
	DIVA_VM* _root;	// 記錄Linked list的root vm

	// 記錄往右和往下的屬性, 作為排列依據
	std::string moveRightAttribute;
	std::string moveDownAttribute;

	// 為了layout建立VM之間關係而使用的變數
	levelmap _levels;
	linkmap _links;

	//
	// 自用方法
	//

	// 取得VM ( 透過VM名稱 )
	DIVA_VM *get_VM(DIVA_VM *vm, std::string attributeName);

protected:
	// 搜尋layout中的root VM
	void searchRoot(std::vector<DIVA_VM*>);

	// 判斷子VM的位置
	void determineChildsPosition(DIVA_VM*,std::vector<pair<int,DIVA_VM*>>,int);
public:
	LinkList_Dynamic_Lyvm();

	// 以下方法會被Basic_Dynamic_lyvm類別的建構子呼叫
	virtual void initial(DIVA_VM*);

	// 未實作
	virtual void showDialog();
	virtual void setupParameters();
	virtual void setupDialog();

	virtual string getDescription(){return "This is a link list example layout.";}

	// 設定此layout的作用範圍 會被Basic_Dynamic_lyvm::doLayout()方法所呼叫
	virtual void layout(std::vector<DIVA_VM*> vms,DIVA_VM* movedVM = NULL);

	// Animable介面: 此方法會在每次frame更新時被呼叫
	virtual void behavior(float);			
};
#endif